package dao.xml;

import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import model.Adresse;
import model.Anlage;
import model.Teilnehmer;
import model.Termin;
import model.Terminplaner;
import model.Termin.TerminArt;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class TerminDOMdao {

	
	private DocumentBuilder db;
	private Document doc;
	
	public TerminDOMdao() throws ParserConfigurationException
	{DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

	 db = dbf.newDocumentBuilder();

	 	
	}
	
	 public Terminplaner getTermine(InputStream stream) throws SAXException, IOException, DOMException, ParseException
	 {
	  if(stream == null)
		  throw new IllegalArgumentException("Stream darf nicht null sein!");
	  
      Terminplaner termine = new Terminplaner();
	  Termin termin = null;


	  
	  doc = db.parse(stream);
	  Element docElement = doc.getDocumentElement();
	 
	  NodeList terminNodes = docElement.getElementsByTagName("termin");
	  
	  
	  for(int i = 0; i < terminNodes.getLength(); i++)
	  { Node terminNode = terminNodes.item(i);
	    
	   termin = createTerminFromNode(terminNode);
	   termine.addTermin(termin);
	   
	   
	   
	   
	   Node adresse = docElement.getElementsByTagName("adresse").item(i);
	   termin.setAdresse(createAdresseFromNode(adresse));
	   
	   Node teilnehmerlisteNode = docElement.getElementsByTagName("teilnehmerliste").item(i);
	  if (teilnehmerlisteNode != null){
	   NodeList teilnehmerNode = teilnehmerlisteNode.getChildNodes();
	   for(int y = 0; y < teilnehmerNode.getLength(); y++)
	   {
				if("teilnehmer".equalsIgnoreCase(teilnehmerNode.item(y).getNodeName()) && teilnehmerNode.item(y).getAttributes() != null)	  
			    {
				 Teilnehmer teilnehmer = createTeilnehmerFromNode(teilnehmerNode.item(y));

		         termin.addTeilnehmer(teilnehmer);
			    }
			  }
	   } 
	   
	   Node anlagenNodes = docElement.getElementsByTagName("anlagen").item(i);
	   if(anlagenNodes != null){
	   NodeList anlageNode = anlagenNodes.getChildNodes();
	     
		  for( int t = 0; t < anlageNode.getLength(); t++)
		  {	if("anlage".equalsIgnoreCase(anlageNode.item(t).getNodeName()) && anlageNode.item(t).getAttributes() != null)	  
		    {
			 Anlage anlage = createAnlageFromNode(anlageNode.item(t));

	         termin.addAnlage(anlage);
		    }
		  }
	   }
	   
		     }

	
	   

	  return termine;
	  }



	private Teilnehmer createTeilnehmerFromNode(Node teilnehmerNode) {
		NamedNodeMap attribute = teilnehmerNode.getAttributes();
		String vorname = attribute.getNamedItem("vorname").getNodeValue();
		String nachname = attribute.getNamedItem("nachname").getNodeValue();
		String anrede = attribute.getNamedItem("anrede").getNodeValue();
		
		Teilnehmer teilnehmer = new Teilnehmer(vorname, nachname, anrede);
		
		return teilnehmer;
	}

	private Anlage createAnlageFromNode(Node anlageNode) throws DOMException, ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
		NamedNodeMap attribute = anlageNode.getAttributes();
		
		String beschreibung = attribute.getNamedItem("beschreibung").getNodeValue();
		String pfad = attribute.getNamedItem("pfad").getNodeValue();
		Date timestamp = sdf.parse(attribute.getNamedItem("timestamp").getNodeValue());
		Anlage anlage = new Anlage(beschreibung, pfad, timestamp);
		return anlage;
	}

	private Adresse createAdresseFromNode(Node adressNode) {
		NamedNodeMap attribute = adressNode.getAttributes();
		String ort = attribute.getNamedItem("ort").getNodeValue();
		String plz = attribute.getNamedItem("plz").getNodeValue();
		String strasse = attribute.getNamedItem("strasse").getNodeValue();
		String land = attribute.getNamedItem("land").getNodeValue();
		
		Adresse adresse = new Adresse(ort, plz, strasse, land);
		
		return adresse;
	}

	private Termin createTerminFromNode(Node terminNode) throws DOMException, ParseException {

		NamedNodeMap attribute = terminNode.getAttributes();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
		
		
		String thema = attribute.getNamedItem("thema").getNodeValue();
		String beschreibung = attribute.getNamedItem("beschreibung").getNodeValue();
		Date terminAnfang = sdf.parse(attribute.getNamedItem("terminanfang").getNodeValue());
		Date terminEnde = sdf.parse(attribute.getNamedItem("terminende").getNodeValue());
		TerminArt terminArt = TerminArt.getTerminArt(attribute.getNamedItem("terminart").getNodeValue());
		Integer prioritaet = Integer.valueOf(attribute.getNamedItem("prioritaet").getNodeValue());
		Adresse adresse = new Adresse("1", "1", "1","1");
		
		Termin termin = new Termin(thema, beschreibung, terminAnfang, terminEnde, terminArt, prioritaet, adresse);
		return termin;
	}
	 
	
}
